OAuth 2.0 для мобильных и настольных приложений

В этом документе объясняется, как приложения, установленные на таких устройствах, как телефоны, планшеты и компьютеры, используют конечные точки Google OAuth 2.0 для авторизации доступа к API данных YouTube.

OAuth 2.0 позволяет пользователям делиться определенными данными с приложением, сохраняя при этом свои имена пользователей, пароли и другую информацию конфиденциальной. Например, приложение может использовать OAuth 2.0 для получения разрешения на загрузку видео на канал пользователя YouTube.

Установленные приложения распространяются на отдельные устройства, и предполагается, что эти приложения не могут хранить секреты. Они могут получать доступ к API Google, пока пользователь присутствует в приложении или когда приложение работает в фоновом режиме.

Этот поток авторизации аналогичен потоку, используемому для приложений веб-сервера . Главное отличие состоит в том, что установленные приложения должны открывать системный браузер и предоставлять локальный URI перенаправления для обработки ответов от сервера авторизации Google.

Альтернативы

Для мобильных приложений вы можете предпочесть Google Sign-in для Android или iOS . Клиентские библиотеки Google Sign-in обрабатывают аутентификацию и авторизацию пользователей, и их может быть проще реализовать, чем описанный здесь протокол более низкого уровня.

Для приложений, работающих на устройствах, которые не поддерживают системный браузер или имеют ограниченные возможности ввода, таких как телевизоры, игровые консоли, камеры или принтеры, см. OAuth 2.0 для телевизоров и устройств или Вход на телевизорах и устройствах с ограниченными возможностями ввода .

Библиотеки и образцы

Мы рекомендуем следующие библиотеки и примеры, которые помогут вам реализовать процесс OAuth 2.0, описанный в этом документе:

Предпосылки

Включите API для вашего проекта

Любое приложение, которое вызывает API Google, должно включить эти API в API Console.

Чтобы включить API для вашего проекта:

  1. Open the API Library в Google API Console.
  2. If prompted, select a project, or create a new one.
  3. Используйте страницу библиотеки , чтобы найти и включить API данных YouTube. Найдите любые другие API, которые будет использовать ваше приложение, и включите их тоже.

Создать учетные данные для авторизации

Любое приложение, использующее OAuth 2.0 для доступа к API Google, должно иметь учетные данные авторизации, которые идентифицируют приложение на сервере OAuth 2.0 Google. Следующие шаги объясняют, как создать учетные данные для вашего проекта. Затем ваши приложения могут использовать учетные данные для доступа к API, которые вы включили для этого проекта.

  1. Go to the Credentials page.
  2. Нажмите Создать клиента .
  3. В следующих разделах описываются типы клиентов, которые поддерживает сервер авторизации Google. Выберите тип клиента, рекомендуемый для вашего приложения, назовите своего клиента OAuth и задайте другие поля в форме соответствующим образом.
андроид
  1. Выберите тип приложения Android .
  2. Введите имя для клиента OAuth. Это имя будет отображаться на вашем проекте для идентификации клиента.
  3. Введите имя пакета вашего приложения Android. Это значение определяется в атрибуте package элемента <manifest> в файле манифеста вашего приложения.
  4. Введите отпечаток сертификата подписи SHA-1 для дистрибутива приложения.
    • Если ваше приложение использует функцию подписи приложений Google Play , скопируйте отпечаток SHA-1 со страницы подписи приложений в Play Console.
    • Если вы управляете собственным хранилищем ключей и ключами подписи, используйте утилиту keytool , входящую в состав Java, для печати информации о сертификате в удобном для восприятия человеком формате. Скопируйте значение SHA1 в разделе Certificate fingerprints выходных данных keytool . Для получения дополнительной информации см. раздел Authenticating Your Client в документации API Google для Android.
  5. (Необязательно) Подтвердите право собственности на ваше приложение Android.
  6. Нажмите «Создать» .
iOS
  1. Выберите тип приложения iOS .
  2. Введите имя для клиента OAuth. Это имя будет отображаться на вашем проекте для идентификации клиента.
  3. Введите идентификатор пакета для вашего приложения. Идентификатор пакета — это значение ключа CFBundleIdentifier в файле ресурсов списка свойств информации вашего приложения ( info.plist ). Значение чаще всего отображается на панели «Общие» или на панели «Подписание и возможности» редактора проектов Xcode. Идентификатор пакета также отображается в разделе «Общие сведения» на странице «Информация о приложении» для приложения на сайте App Store Connect компании Apple .

    Убедитесь, что вы используете правильный идентификатор пакета для своего приложения, так как вы не сможете изменить его, если используете функцию проверки приложений.

  4. (Необязательный)

    Введите App Store ID вашего приложения, если приложение опубликовано в App Store от Apple. Store ID — это числовая строка, включенная в каждый URL-адрес Apple App Store.

    1. Откройте приложение Apple App Store на устройстве iOS или iPadOS.
    2. Найдите свое приложение.
    3. Нажмите кнопку «Поделиться» (квадрат и стрелка вверх).
    4. Выберите Копировать ссылку .
    5. Вставьте ссылку в текстовый редактор. Идентификатор App Store — это конечная часть URL.

      Пример: https://apps.apple.com/app/google/id 284815942

  5. (Необязательный)

    Введите свой Team ID. Для получения дополнительной информации см. раздел Найдите свой Team ID в документации Apple Developer Account.

    Примечание: Поле идентификатора команды обязательно, если вы включаете проверку приложений для своего клиента.
  6. (Необязательный)

    Включите App Check для вашего приложения iOS. Когда вы включаете App Check, служба App Attest от Apple используется для проверки того, что запросы OAuth 2.0, исходящие от вашего клиента OAuth, являются подлинными и исходят от вашего приложения. Это помогает снизить риск подмены приложения. Узнайте больше о включении App Check для вашего приложения iOS .

  7. Нажмите «Создать» .
УВП
  1. Выберите тип приложения «Универсальная платформа Windows» .
  2. Введите имя для клиента OAuth. Это имя будет отображаться на вашем проекте для идентификации клиента.
  3. Введите 12-значный идентификатор Microsoft Store вашего приложения. Это значение можно найти в Microsoft Partner Center на странице App identity в разделе App management.
  4. Нажмите «Создать» .

Для приложений UWP пользовательская схема URI не может быть длиннее 39 символов.

Определить области доступа

Области действия позволяют вашему приложению запрашивать доступ только к тем ресурсам, которые ему нужны, а также позволяют пользователям контролировать объем доступа, который они предоставляют вашему приложению. Таким образом, может существовать обратная зависимость между количеством запрошенных областей действия и вероятностью получения согласия пользователя.

Прежде чем приступить к реализации авторизации OAuth 2.0, мы рекомендуем вам определить области, для доступа к которым вашему приложению потребуется разрешение.

API данных YouTube v3 использует следующие области действия:

Сферы
https://www.googleapis.com/auth/youtube Управляйте своим аккаунтом YouTube
https://www.googleapis.com/auth/youtube.channel-memberships.creator Просматривайте список ваших текущих активных участников канала, их текущий уровень и время, когда они стали участником.
https://www.googleapis.com/auth/youtube.force-ssl Просматривайте, редактируйте и безвозвратно удаляйте свои видео, рейтинги, комментарии и подписи на YouTube.
https://www.googleapis.com/auth/youtube.readonly Просмотрите свой аккаунт YouTube
https://www.googleapis.com/auth/youtube.upload Управляйте своими видео на YouTube
https://www.googleapis.com/auth/youtubepartner Просмотр и управление своими объектами и связанным контентом на YouTube
https://www.googleapis.com/auth/youtubepartner-channel-audit Просмотр личной информации о вашем канале YouTube, актуальной в процессе аудита с партнером YouTube.

Документ «Области действия API OAuth 2.0» содержит полный список областей действия, которые можно использовать для доступа к API Google.

Получение токенов доступа OAuth 2.0

Следующие шаги показывают, как ваше приложение взаимодействует с сервером OAuth 2.0 Google для получения согласия пользователя на выполнение запроса API от имени пользователя. Ваше приложение должно иметь это согласие, прежде чем оно сможет выполнить запрос API Google, требующий авторизации пользователя.

Шаг 1: Создайте верификатор кода и вызов

Google поддерживает протокол Proof Key for Code Exchange (PKCE), чтобы сделать поток установленного приложения более безопасным. Для каждого запроса авторизации создается уникальный верификатор кода, а его преобразованное значение, называемое «code_challenge», отправляется на сервер авторизации для получения кода авторизации.

Создать верификатор кода

code_verifier — это высокоэнтропийная криптографическая случайная строка, использующая незарезервированные символы [AZ] / [az] / [0-9] / "-" / "." / "_" / "~", с минимальной длиной 43 символа и максимальной длиной 128 символов.

Верификатор кода должен обладать достаточной энтропией, чтобы сделать угадывание значения нецелесообразным.

Создайте кодовое задание

Поддерживаются два метода создания задания по коду.

Методы генерации кода вызова
S256 (рекомендуется) Проверка кода представляет собой закодированный по Base64URL (без заполнения) хэш SHA256 верификатора кода.
code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier)))
простой Код проверки имеет то же значение, что и верификатор кода, сгенерированный выше.
code_challenge = code_verifier

Шаг 2: Отправьте запрос на сервер Google OAuth 2.0

Чтобы получить авторизацию пользователя, отправьте запрос на сервер авторизации Google по адресу https://accounts.google.com/o/oauth2/v2/auth . Эта конечная точка обрабатывает поиск активного сеанса, аутентифицирует пользователя и получает его согласие. Конечная точка доступна только через SSL и отклоняет HTTP-соединения (не SSL).

Сервер авторизации поддерживает следующие параметры строки запроса для установленных приложений:

Параметры
client_id Необходимый

Идентификатор клиента для вашего приложения. Вы можете найти это значение в .

redirect_uri Необходимый

Определяет, как сервер авторизации Google отправляет ответ вашему приложению. Для установленных приложений доступно несколько вариантов перенаправления, и вам придется настроить свои учетные данные авторизации с учетом определенного метода перенаправления.

Значение должно точно соответствовать одному из разрешенных URI перенаправления для клиента OAuth 2.0, который вы настроили в клиенте. . Если это значение не соответствует авторизованному URI, вы получите ошибку redirect_uri_mismatch .

В таблице ниже показано соответствующее значение параметра redirect_uri для каждого метода:

значения redirect_uri
Пользовательская схема URI com.example.app : redirect_uri_path

или

com.googleusercontent.apps.123 : redirect_uri_path
  • com.example.app — это обратная запись DNS домена под вашим контролем. Пользовательская схема должна содержать точку, чтобы быть действительной.
  • com.googleusercontent.apps.123 — это обратная DNS-запись идентификатора клиента.
  • redirect_uri_path — необязательный компонент пути, например /oauth2redirect . Обратите внимание, что путь должен начинаться с одной косой черты, что отличается от обычных HTTP URL.
IP-адрес обратной связи http://127.0.0.1: port или http://[::1]: port

Запросите у своей платформы соответствующий IP-адрес обратной петли и запустите прослушиватель HTTP на случайном доступном порту. Замените port на фактический номер порта, который прослушивает ваше приложение.

Обратите внимание, что поддержка опции перенаправления IP-адреса обратной связи в мобильных приложениях УСТАРЕВШАЕТ .

response_type Необходимый

Определяет, возвращает ли конечная точка Google OAuth 2.0 код авторизации.

Установите значение параметра для code установленных приложений.

scope Необходимый

Разделенный пробелами список областей, которые определяют ресурсы, к которым ваше приложение может получить доступ от имени пользователя. Эти значения информируют экран согласия, который Google отображает пользователю.

Области действия позволяют вашему приложению запрашивать доступ только к тем ресурсам, которые ему нужны, а также позволяют пользователям контролировать объем доступа, который они предоставляют вашему приложению. Таким образом, существует обратная зависимость между количеством запрошенных областей действия и вероятностью получения согласия пользователя.

API данных YouTube v3 использует следующие области действия:

Сферы
https://www.googleapis.com/auth/youtube Управляйте своим аккаунтом YouTube
https://www.googleapis.com/auth/youtube.channel-memberships.creator Просматривайте список ваших текущих активных участников канала, их текущий уровень и время, когда они стали участником.
https://www.googleapis.com/auth/youtube.force-ssl Просматривайте, редактируйте и безвозвратно удаляйте свои видео, рейтинги, комментарии и подписи на YouTube.
https://www.googleapis.com/auth/youtube.readonly Просмотрите свой аккаунт YouTube
https://www.googleapis.com/auth/youtube.upload Управляйте своими видео на YouTube
https://www.googleapis.com/auth/youtubepartner Просмотр и управление своими объектами и связанным контентом на YouTube
https://www.googleapis.com/auth/youtubepartner-channel-audit Просмотр личной информации о вашем канале YouTube, актуальной в процессе аудита с партнером YouTube.

Документ «Области действия API OAuth 2.0» содержит полный список областей действия, которые можно использовать для доступа к API Google.

code_challenge Рекомендовано

Указывает закодированный code_verifier , который будет использоваться в качестве серверного вызова во время обмена кодами авторизации. Для получения дополнительной информации см. раздел создания кода вызова выше.

code_challenge_method Рекомендовано

Указывает, какой метод использовался для кодирования code_verifier , который будет использоваться во время обмена кодами авторизации. Этот параметр должен использоваться с параметром code_challenge , описанным выше. Значение code_challenge_method по умолчанию равно plain , если оно отсутствует в запросе, включающем code_challenge . Единственными поддерживаемыми значениями для этого параметра являются S256 или plain .

state Рекомендовано

Указывает любое строковое значение, которое ваше приложение использует для поддержания состояния между вашим запросом авторизации и ответом сервера авторизации. Сервер возвращает точное значение, которое вы отправляете как пару name=value в идентификаторе фрагмента URL ( # ) redirect_uri после того, как пользователь соглашается или отклоняет запрос доступа вашего приложения.

Этот параметр можно использовать для нескольких целей, например, для направления пользователя на правильный ресурс в вашем приложении, отправки одноразовых кодов и предотвращения подделки межсайтовых запросов. Поскольку ваш redirect_uri можно угадать, использование значения state может повысить вашу уверенность в том, что входящее соединение является результатом запроса аутентификации. Если вы генерируете случайную строку или кодируете хэш cookie или другое значение, которое фиксирует состояние клиента, вы можете проверить ответ, чтобы дополнительно убедиться, что запрос и ответ были созданы в одном и том же браузере, что обеспечивает защиту от таких атак, как подделка межсайтовых запросов . Пример создания и подтверждения токена state см. в документации OpenID Connect.

login_hint Необязательный

Если ваше приложение знает, какой пользователь пытается пройти аутентификацию, оно может использовать этот параметр для предоставления подсказки серверу аутентификации Google. Сервер использует подсказку для упрощения процесса входа либо путем предварительного заполнения поля электронной почты в форме входа, либо путем выбора соответствующей сессии множественного входа.

Задайте в качестве значения параметра адрес электронной почты или sub идентификатор, который эквивалентен идентификатору Google пользователя.

Примеры URL-адресов авторизации

На вкладках ниже показаны примеры URL-адресов авторизации для различных вариантов URI перенаправления.

Каждый URL-адрес запрашивает доступ к области, которая разрешает просмотр аккаунта пользователя YouTube.

URL-адреса идентичны, за исключением значения параметра redirect_uri . URL-адреса также содержат обязательные параметры response_type и client_id , а также необязательный параметр state . Каждый URL-адрес содержит разрывы строк и пробелы для удобства чтения.

Пользовательская схема URI

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
 response_type=code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken&
 redirect_uri=com.example.app%3A/oauth2redirect&
 client_id=client_id

IP-адрес обратной связи

https://accounts.google.com/o/oauth2/v2/auth?
 scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube.readonly&
 response_type=code&
 state=security_token%3D138r5719ru3e1%26url%3Dhttps%3A%2F%2Foauth2.example.com%2Ftoken&
 redirect_uri=http%3A//127.0.0.1%3A9004&
 client_id=client_id

Шаг 3: Google запрашивает у пользователя согласие

На этом этапе пользователь решает, предоставить ли вашему приложению запрошенный доступ. На этом этапе Google отображает окно согласия, в котором указано имя вашего приложения и службы API Google, для которых оно запрашивает разрешение на доступ с учетными данными пользователя и сводкой областей доступа, которые должны быть предоставлены. Затем пользователь может дать согласие на предоставление доступа к одной или нескольким областям, запрошенным вашим приложением, или отклонить запрос.

Вашему приложению не нужно ничего делать на этом этапе, поскольку оно ждет ответа от сервера Google OAuth 2.0, указывающего, был ли предоставлен какой-либо доступ. Этот ответ объясняется в следующем шаге.

Ошибки

Запросы к конечной точке авторизации OAuth 2.0 Google могут отображать сообщения об ошибках, с которыми сталкивается пользователь, вместо ожидаемых потоков аутентификации и авторизации. Ниже перечислены распространенные коды ошибок и предлагаемые решения.

admin_policy_enforced

Аккаунт Google не может авторизовать одну или несколько запрошенных областей из-за политик администратора Google Workspace. См. статью справки администратора Google Workspace Управление доступом сторонних и внутренних приложений к данным Google Workspace для получения дополнительной информации о том, как администратор может ограничить доступ ко всем областям или конфиденциальным и ограниченным областям, пока доступ не будет явно предоставлен вашему идентификатору клиента OAuth.

disallowed_useragent

Конечная точка авторизации отображается внутри встроенного пользовательского агента, что запрещено политиками Google OAuth 2.0 .

андроид

Разработчики Android могут столкнуться с этим сообщением об ошибке при открытии запросов авторизации вandroid.webkit.WebView . Вместо этого разработчикам следует использовать библиотеки Android, такие как Google Sign-In для Android или AppAuth для Android от OpenID Foundation .

Веб-разработчики могут столкнуться с этой ошибкой, когда приложение Android открывает общую веб-ссылку во встроенном пользовательском агенте, а пользователь переходит на конечную точку авторизации Google OAuth 2.0 с вашего сайта. Разработчики должны разрешить открытие общих ссылок в обработчике ссылок по умолчанию операционной системы, который включает как обработчики ссылок приложений Android , так и приложение браузера по умолчанию. Библиотека Android Custom Tabs также является поддерживаемой опцией.

iOS

Разработчики iOS и macOS могут столкнуться с этой ошибкой при открытии запросов авторизации вWKWebView . Вместо этого разработчикам следует использовать библиотеки iOS, такие как Google Sign-In для iOS или AppAuth от OpenID Foundation для iOS .

Веб-разработчики могут столкнуться с этой ошибкой, когда приложение iOS или macOS открывает общую веб-ссылку во встроенном пользовательском агенте, а пользователь переходит на конечную точку авторизации Google OAuth 2.0 с вашего сайта. Разработчики должны разрешить открытие общих ссылок в обработчике ссылок по умолчанию операционной системы, который включает как обработчики Universal Links , так и приложение браузера по умолчанию. БиблиотекаSFSafariViewController также является поддерживаемой опцией.

org_internal

Идентификатор клиента OAuth в запросе является частью проекта, ограничивающего доступ к аккаунтам Google в определенной организации Google Cloud . Для получения дополнительной информации об этом параметре конфигурации см. раздел Тип пользователя в справочной статье Настройка экрана согласия OAuth.

deleted_client

Клиент OAuth, используемый для выполнения запроса, был удален. Удаление может происходить вручную или автоматически в случае неиспользуемых клиентов . Удаленные клиенты могут быть восстановлены в течение 30 дней с момента удаления. Узнать больше .

invalid_grant

Если вы используете верификатор кода и вызов , параметр code_callenge недействителен или отсутствует. Убедитесь, что параметр code_challenge установлен правильно.

При обновлении токена доступа , токен мог быть просрочен или недействителен. Повторно аутентифицируйте пользователя и запросите его согласие на получение новых токенов. Если вы продолжаете видеть эту ошибку, убедитесь, что ваше приложение настроено правильно и что вы используете правильные токены и параметры в своем запросе. В противном случае учетная запись пользователя могла быть удалена или отключена.

redirect_uri_mismatch

redirect_uri переданный в запросе авторизации, не соответствует авторизованному URI перенаправления для идентификатора клиента OAuth. Проверьте авторизованные URI перенаправления в .

Переданный redirect_uri может быть недопустимым для данного типа клиента.

Параметр redirect_uri может ссылаться на поток OAuth out-of-band (OOB), который устарел и больше не поддерживается. Обратитесь к руководству по миграции , чтобы обновить вашу интеграцию.

invalid_request

Что-то не так с вашим запросом. Это может быть вызвано рядом причин:

  • Запрос не был правильно отформатирован.
  • В запросе отсутствовали обязательные параметры
  • Запрос использует метод авторизации, который Google не поддерживает. Убедитесь, что ваша интеграция OAuth использует рекомендуемый метод интеграции
  • Для перенаправления uri используется пользовательская схема: Если вы видите сообщение об ошибке Пользовательская схема URI не поддерживается в приложениях Chrome или Пользовательская схема URI не включена для вашего клиента Android , это означает, что вы используете пользовательскую схему URI, которая не поддерживается в приложениях Chrome и по умолчанию отключена на Android. Узнайте больше об альтернативах пользовательской схемы URI

Шаг 4: Обработка ответа сервера OAuth 2.0

Способ, которым ваше приложение получает ответ авторизации, зависит от схемы перенаправления URI , которую оно использует. Независимо от схемы, ответ будет содержать либо код авторизации ( code ), либо ошибку ( error ). Например, error=access_denied указывает на то, что пользователь отклонил запрос.

Если пользователь предоставляет доступ к вашему приложению, вы можете обменять код авторизации на токен доступа и токен обновления, как описано в следующем шаге.

Шаг 5: Обмен кода авторизации на токены обновления и доступа

Чтобы обменять код авторизации на токен доступа, вызовите конечную точку https://oauth2.googleapis.com/token и задайте следующие параметры:

Поля
client_id Идентификатор клиента, полученный от .
client_secret Секрет клиента, полученный от .
code Код авторизации, возвращенный из первоначального запроса.
code_verifier Верификатор кода, созданный вами на шаге 1 .
grant_type Как определено в спецификации OAuth 2.0 , значение этого поля должно быть установлено на authorization_code .
redirect_uri Один из URI перенаправления, перечисленных для вашего проекта в для указанного client_id .

В следующем фрагменте показан пример запроса:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=http://127.0.0.1:9004&
grant_type=authorization_code

Google отвечает на этот запрос, возвращая объект JSON, содержащий краткосрочный токен доступа и токен обновления.

Ответ содержит следующие поля:

Поля
access_token Токен, который ваше приложение отправляет для авторизации запроса API Google.
expires_in Оставшееся время жизни токена доступа в секундах.
id_token Примечание: Это свойство возвращается только в том случае, если ваш запрос включал область идентификации, например, openid , profile или email . Значение представляет собой JSON Web Token (JWT), содержащий цифровую подпись идентификационной информации о пользователе.
refresh_token Токен, который можно использовать для получения нового токена доступа. Токены обновления действительны до тех пор, пока пользователь не отменит доступ или не истечет срок действия токена обновления. Обратите внимание, что токены обновления всегда возвращаются для установленных приложений.
refresh_token_expires_in Оставшееся время жизни токена обновления в секундах. Это значение устанавливается только тогда, когда пользователь предоставляет доступ на основе времени .
scope Области доступа, предоставляемые access_token , выраженные в виде списка разделенных пробелами строк с учетом регистра.
token_type Тип возвращаемого токена. В настоящее время значение этого поля всегда установлено на Bearer .

В следующем фрагменте показан пример ответа:

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "token_type": "Bearer",
  "scope": "https://www.googleapis.com/auth/youtube.force-ssl",
  "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
}

Шаг 6: Проверьте, какие области действия предоставили пользователи

При запросе нескольких разрешений (областей действия) пользователи могут не предоставить вашему приложению доступ ко всем из них. Ваше приложение должно проверять, какие области действия были фактически предоставлены, и корректно обрабатывать ситуации, когда некоторые разрешения отклоняются, обычно отключая функции, которые полагаются на эти отклоненные области действия.

Однако есть исключения. Приложения Google Workspace Enterprise с делегированием полномочий на весь домен или приложения, помеченные как Trusted , обходят экран согласия на детализированные разрешения. Для этих приложений пользователи не увидят экран согласия на детализированные разрешения. Вместо этого ваше приложение либо получит все запрошенные области, либо ни одной.

Более подробную информацию см. в разделе Как работать с детализированными разрешениями .

Чтобы проверить, предоставил ли пользователь вашему приложению доступ к определенной области, проверьте поле scope в ответе токена доступа. Области доступа, предоставленные access_token, выражены в виде списка разделенных пробелами, чувствительных к регистру строк.

Например, следующий пример ответа токена доступа указывает на то, что пользователь предоставил вашему приложению разрешение просматривать, редактировать и навсегда удалять видео, оценки, комментарии и субтитры пользователя на YouTube:

  {
    "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
    "expires_in": 3920,
    "token_type": "Bearer",
    "scope": "https://www.googleapis.com/auth/youtube.force-ssl",
    "refresh_token": "1//xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI"
  }

Вызов API Google

После того, как ваше приложение получит токен доступа, вы сможете использовать его для вызовов API Google от имени данной учетной записи пользователя, если область(ы) доступа, требуемые API, были предоставлены. Для этого включите токен доступа в запрос к API, включив либо параметр запроса access_token , либо значение заголовка HTTP Authorization Bearer . Когда это возможно, предпочтительнее использовать заголовок HTTP, поскольку строки запросов, как правило, видны в журналах сервера. В большинстве случаев вы можете использовать клиентскую библиотеку для настройки вызовов API Google (например, при вызове API данных YouTube ).

Обратите внимание, что API данных YouTube поддерживает учетные записи служб только для владельцев контента YouTube, которые владеют и управляют несколькими каналами YouTube, например, звукозаписывающими компаниями и киностудиями.

Вы можете опробовать все API Google и ознакомиться с их возможностями на OAuth 2.0 Playground .

Примеры HTTP GET

Вызов конечной точки youtube.channels (API данных YouTube) с использованием HTTP-заголовка Authorization: Bearer может выглядеть следующим образом. Обратите внимание, что вам необходимо указать собственный токен доступа:

GET /youtube/v3/channels?part=snippet&mine=true HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer access_token

Вот вызов того же API для аутентифицированного пользователя с использованием параметра строки запроса access_token :

GET https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true

примеры curl

Вы можете протестировать эти команды с помощью приложения командной строки curl . Вот пример, который использует опцию заголовка HTTP (предпочтительно):

curl -H "Authorization: Bearer access_token" https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true

Или, в качестве альтернативы, параметр строки запроса:

curl https://www.googleapis.com/youtube/v3/channels?access_token=access_token&part=snippet&mine=true

Обновление токена доступа

Токены доступа периодически истекают и становятся недействительными учетными данными для соответствующего запроса API. Вы можете обновить токен доступа, не запрашивая у пользователя разрешения (в том числе, когда пользователь отсутствует), если вы запросили офлайн-доступ к областям, связанным с токеном.

Чтобы обновить токен доступа, ваше приложение отправляет HTTPS POST запрос на сервер авторизации Google ( https://oauth2.googleapis.com/token ), включающий следующие параметры:

Поля
client_id Идентификатор клиента, полученный от API Console.
client_secret Секрет клиента, полученный от API Console. ( client_secret не применим к запросам от клиентов, зарегистрированных как приложения Android, iOS или Chrome.)
grant_type Как определено в спецификации OAuth 2.0 , значение этого поля должно быть установлено на refresh_token .
refresh_token Токен обновления, возвращенный в результате обмена кодами авторизации.

В следующем фрагменте показан пример запроса:

POST /token HTTP/1.1
Host: oauth2.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=your_client_id&
client_secret=your_client_secret&
refresh_token=refresh_token&
grant_type=refresh_token

Пока пользователь не отменил доступ, предоставленный приложению, сервер токенов возвращает объект JSON, содержащий новый токен доступа. Следующий фрагмент показывает пример ответа:

{
  "access_token": "1/fFAGRNJru1FTz70BzhT3Zg",
  "expires_in": 3920,
  "scope": "https://www.googleapis.com/auth/drive.metadata.readonly",
  "token_type": "Bearer"
}

Обратите внимание, что существуют ограничения на количество выдаваемых токенов обновления: одно ограничение на комбинацию клиент/пользователь и еще одно ограничение на пользователя по всем клиентам. Вам следует сохранять токены обновления в долгосрочном хранилище и продолжать использовать их, пока они остаются действительными. Если ваше приложение запрашивает слишком много токенов обновления, оно может столкнуться с этими ограничениями, и в этом случае старые токены обновления перестанут работать.

Отзыв токена

В некоторых случаях пользователь может захотеть отозвать доступ, предоставленный приложению. Пользователь может отозвать доступ, посетив Настройки учетной записи . Дополнительную информацию см. в разделе Удалить доступ к сайту или приложению в документе поддержки Сторонние сайты и приложения с доступом к вашей учетной записи .

Приложение также может программно отозвать предоставленный ему доступ. Программный отзыв важен в случаях, когда пользователь отписывается, удаляет приложение или ресурсы API, необходимые приложению, существенно изменились. Другими словами, часть процесса удаления может включать запрос API, чтобы гарантировать, что разрешения, ранее предоставленные приложению, будут удалены.

Чтобы программно отозвать токен, ваше приложение отправляет запрос на https://oauth2.googleapis.com/revoke и включает токен в качестве параметра:

curl -d -X -POST --header "Content-type:application/x-www-form-urlencoded" \
        https://oauth2.googleapis.com/revoke?token={token}

Токен может быть токеном доступа или токеном обновления. Если токен является токеном доступа и у него есть соответствующий токен обновления, токен обновления также будет отозван.

Если отзыв успешно обработан, то код статуса HTTP ответа равен 200 В случае возникновения ошибок возвращается код статуса HTTP 400 вместе с кодом ошибки.

Методы перенаправления приложений

Пользовательская схема URI (Android, iOS, UWP)

Пользовательские схемы URI — это форма глубоких ссылок, которая использует пользовательскую схему для открытия вашего приложения.

Альтернатива использованию пользовательских схем URI на Android

Используйте рекомендуемую альтернативу , которая доставляет ответ OAuth 2.0 непосредственно в ваше приложение, устраняя необходимость в URI перенаправления.

Как перейти на библиотеку Google Identity Services Android

Если вы используете пользовательскую схему для интеграции OAuth на Android, вам потребуется выполнить следующие действия, чтобы полностью перейти на использование рекомендуемой библиотеки Google Identity Services Android:

  1. Обновите свой код, чтобы использовать библиотеку Android Google Identity Services.
  2. Отключить поддержку пользовательской схемы в Google Cloud Console.

Далее подробно описывается, как перейти на библиотеку Google Identity Services Android:

  1. Обновите свой код для использования библиотеки Google Identity Services Android:
    1. Проверьте свой код, чтобы определить, отправляете ли вы запрос на сервер Google OAuth 2.0 ; если вы используете пользовательскую схему, ваш запрос будет выглядеть следующим образом:
        https://accounts.google.com/o/oauth2/v2/auth?
        scope=<SCOPES>&
        response_type=code&
        &state=<STATE>&
        redirect_uri=com.example.app:/oauth2redirect&
        client_id=<CLIENT_ID>
        
      com.example.app:/oauth2redirect — это URI перенаправления пользовательской схемы в примере выше. См. определение параметра redirect_uri для получения более подробной информации о формате значения пользовательской схемы URI.
    2. Запишите параметры запроса scope и client_id , которые вам понадобятся для настройки Google Sign-In SDK.
    3. Следуйте инструкциям по авторизации доступа к данным пользователя Google , чтобы настроить SDK. Вы можете пропустить шаг «Настройка вашего проекта Google Cloud Console», так как вы бы повторно использовали client_id , полученный на предыдущем шаге.
    4. Следуйте инструкциям Запросить разрешения, требуемые действиями пользователя . Это включает следующие шаги:
      1. Запросить разрешения у пользователя.
      2. Используйте метод getServerAuthCode для получения кода аутентификации для областей, для которых вы запрашиваете разрешение.
      3. Отправьте код аутентификации на серверную часть вашего приложения, чтобы обменять его на токен доступа и обновления.
      4. Используйте полученный токен доступа для совершения вызовов API Google от имени пользователя.
  2. Отключите поддержку пользовательской схемы в Google API Console:
    1. Перейдите к списку учетных данных OAuth 2.0 и выберите свой клиент Android.
    2. Перейдите в раздел «Дополнительные параметры» , снимите флажок «Включить пользовательскую схему URI» и нажмите « Сохранить» , чтобы отключить поддержку пользовательской схемы URI.

Включить пользовательскую схему URI

Если рекомендуемый вариант вам не подходит, вы можете включить пользовательские схемы URI для своего клиента Android, следуя инструкциям ниже:
  1. Перейдите к списку учетных данных OAuth 2.0 и выберите свой клиент Android.
  2. Перейдите в раздел «Дополнительные параметры» , установите флажок «Включить пользовательскую схему URI» и нажмите « Сохранить» , чтобы включить поддержку пользовательской схемы URI.

Альтернатива использованию пользовательских схем URI в приложениях Chrome

Используйте API Chrome Identity , который доставляет ответ OAuth 2.0 непосредственно в ваше приложение, устраняя необходимость в URI перенаправления.

IP-адрес обратной связи (macOS, Linux, Windows для настольных ПК)

Чтобы получить код авторизации с помощью этого URL, ваше приложение должно прослушивать локальный веб-сервер. Это возможно на многих, но не на всех платформах. Однако, если ваша платформа поддерживает это, это рекомендуемый механизм получения кода авторизации.

Когда ваше приложение получает ответ на авторизацию, для лучшего удобства использования оно должно отобразить HTML-страницу, которая предложит пользователю закрыть браузер и вернуться в ваше приложение.

Рекомендуемое использование Приложения для macOS, Linux и Windows (но не для универсальной платформы Windows)
Формировать значения Установите тип приложения на «Приложение для ПК» .

Ручное копирование/вставка (устарело)

Защитите свои приложения

Подтвердите право собственности на приложение (Android, Chrome)

Вы можете подтвердить право собственности на свое приложение, чтобы снизить риск его выдачи за другое лицо.

андроид

Для завершения процесса проверки вы можете использовать свой аккаунт разработчика Google Play, если он у вас есть и ваше приложение зарегистрировано в Google Play Console . Для успешной проверки должны быть выполнены следующие требования:

  • У вас должно быть зарегистрированное приложение в Google Play Console с тем же именем пакета и отпечатком сертификата подписи SHA-1, что и у клиента Android OAuth, для которого вы проходите проверку.
  • У вас должно быть разрешение администратора для приложения в Google Play Console. Узнайте больше об управлении доступом в Google Play Console.

В разделе «Проверка права собственности на приложение» клиента Android нажмите кнопку «Проверка права собственности» , чтобы завершить процесс проверки.

Если проверка прошла успешно, будет отображено уведомление, подтверждающее успешность процесса проверки. В противном случае будет отображено сообщение об ошибке.

Чтобы исправить ошибку проверки, попробуйте сделать следующее:

  • Убедитесь, что проверяемое вами приложение зарегистрировано в Google Play Console.
  • Убедитесь, что у вас есть права администратора для приложения в Google Play Console.
Хром

Для завершения процесса проверки вам необходимо использовать учетную запись разработчика Chrome Web Store. Для успешной проверки должны быть выполнены следующие требования:

  • У вас должен быть зарегистрированный элемент в панели разработчика Chrome Web Store с тем же идентификатором элемента, что и у клиента OAuth расширения Chrome, для которого вы выполняете проверку.
  • Вы должны быть издателем элемента Chrome Web Store. Узнайте больше об управлении доступом в Chrome Web Store Developer Dashboard.

В разделе «Проверка права собственности на приложение» клиента расширения Chrome нажмите кнопку «Проверка права собственности» , чтобы завершить процесс проверки.

Примечание: Подождите несколько минут, прежде чем завершить процесс проверки после предоставления доступа к вашей учетной записи.

Если проверка прошла успешно, будет отображено уведомление, подтверждающее успешность процесса проверки. В противном случае будет отображено сообщение об ошибке.

Чтобы исправить ошибку проверки, попробуйте сделать следующее:

  • Убедитесь, что на панели инструментов разработчика Chrome Web Store есть зарегистрированный элемент с тем же идентификатором элемента, что и у клиента OAuth расширения Chrome, для которого вы выполняете проверку.
  • Убедитесь, что вы являетесь издателем приложения, то есть вы должны быть либо индивидуальным издателем приложения, либо членом группы издателей приложения. Узнайте больше об управлении доступом в Chrome Web Store Developer Dashboard.
  • Если вы только что обновили список издателей группы, убедитесь, что список членов группы издателей синхронизирован в панели разработчика Chrome Web Store. Узнайте больше о синхронизации списка членов издателей.

Проверка приложений (только iOS)

Функция App Check помогает защитить ваши приложения iOS от несанкционированного использования, используя службу App Attest от Apple для проверки того, что запросы, направленные на конечные точки Google OAuth 2.0, исходят от ваших подлинных приложений. Это помогает снизить риск подмены приложений.

Включите проверку приложений для вашего клиента iOS

Для успешного включения проверки приложений на вашем iOS-клиенте необходимо выполнить следующие требования:
  • Вам необходимо указать идентификатор команды для вашего iOS-клиента.
  • Вы не должны использовать подстановочный знак в вашем идентификаторе пакета, поскольку он может разрешиться в более чем одно приложение. Это означает, что идентификатор пакета не должен включать символ звездочки (*).
Чтобы включить проверку приложений, включите переключатель «Защитить клиент OAuth от злоупотреблений с помощью проверки приложений Firebase» в окне редактирования клиента iOS.

После включения App Check вы начнете видеть метрики, связанные с запросами OAuth от вашего клиента, в представлении редактирования клиента OAuth. Запросы из непроверенных источников не будут блокироваться, пока вы не включите App Check . Информация на странице мониторинга метрик может помочь вам определить, когда следует начать принудительное применение.

Вы можете увидеть ошибки, связанные с функцией App Check при включении App Check для вашего приложения iOS. Чтобы исправить эти ошибки, попробуйте сделать следующее:

  • Проверьте правильность указанных вами идентификаторов пакета и команды.
  • Убедитесь, что вы не используете подстановочный знак для идентификатора пакета.

Принудительная проверка приложений для вашего iOS-клиента

Включение App Check для вашего приложения не блокирует автоматически нераспознанные запросы. Чтобы обеспечить эту защиту, перейдите в режим редактирования вашего клиента iOS. Там вы увидите метрики App Check справа от страницы в разделе Google Identity для iOS . Метрики включают следующую информацию:
  • Количество проверенных запросов — запросы, имеющие действительный токен App Check. После включения принудительной проверки App Check будут успешными только запросы в этой категории.
  • Количество непроверенных запросов: вероятно, устаревшие клиентские запросы — запросы, в которых отсутствует токен App Check; эти запросы могут быть из старой версии вашего приложения, которая не включает реализацию App Check.
  • Количество непроверенных запросов: запросы неизвестного происхождения — запросы без токена проверки приложения, которые не похожи на запросы, поступающие из вашего приложения.
  • Количество непроверенных запросов: недействительные запросы — запросы с недействительным токеном App Check, которые могут исходить от неаутентичного клиента, пытающегося выдать себя за ваше приложение, или из эмулируемых сред.
Просмотрите эти показатели, чтобы понять, как внедрение проверки приложений повлияет на ваших пользователей.

Чтобы принудительно применить проверку приложений, нажмите кнопку ENFORCE и подтвердите свой выбор. После активации принудительной проверки все непроверенные запросы от вашего клиента будут отклонены.

Примечание : после включения принудительного применения изменения вступят в силу в течение 15 минут.

Отмените проверку приложений для вашего клиента iOS

Отмена принудительной проверки приложений для вашего приложения прекратит принудительное применение и разрешит все запросы от вашего клиента к конечным точкам Google OAuth 2.0, включая непроверенные запросы.

Чтобы отменить проверку приложений для вашего клиента iOS, перейдите в режим редактирования клиента iOS, нажмите кнопку ОТМЕНИТЬ и подтвердите свой выбор.

Примечание : после отмены проверки приложений изменения вступят в силу в течение 15 минут.

Отключите проверку приложений для вашего iOS-клиента

Отключение App Check для вашего приложения остановит весь мониторинг и принудительное применение App Check. Рассмотрите возможность отмены принудительного применения App Check, чтобы вы могли продолжить мониторинг метрик для вашего клиента.

Чтобы отключить проверку приложений для вашего клиента iOS, перейдите в режим редактирования клиента iOS и отключите переключатель «Защитить клиент OAuth от злоупотреблений с помощью проверки приложений Firebase» .

Примечание : после отключения проверки приложений изменения вступят в силу в течение 15 минут.

Доступ по времени

Доступ на основе времени позволяет пользователю предоставить вашему приложению доступ к своим данным на ограниченный период времени для выполнения действия. Доступ на основе времени доступен в некоторых продуктах Google во время потока согласия, предоставляя пользователям возможность предоставить доступ на ограниченный период времени. Примером является API переносимости данных , который позволяет выполнять однократную передачу данных.

Когда пользователь предоставляет вашему приложению доступ на основе времени, токен обновления истекает по истечении указанного периода. Обратите внимание, что токены обновления могут быть аннулированы раньше при определенных обстоятельствах; см. эти случаи для получения подробной информации. Поле refresh_token_expires_in возвращаемое в ответе обмена кодом авторизации, представляет собой время, оставшееся до истечения срока действия токена обновления в таких случаях.

Дальнейшее чтение

В документе IETF Best Current Practice OAuth 2.0 для нативных приложений изложены многие из описанных здесь передовых практик.

Реализация защиты перекрестных счетов

Дополнительным шагом, который вам следует предпринять для защиты учетных записей пользователей, является внедрение Cross-Account Protection с помощью службы Cross-Account Protection от Google. Эта служба позволяет вам подписываться на уведомления о событиях безопасности, которые предоставляют вашему приложению информацию о важных изменениях в учетной записи пользователя. Затем вы можете использовать эту информацию для выполнения действий в зависимости от того, как вы решите реагировать на события.

Вот некоторые примеры типов событий, отправляемых в ваше приложение службой защиты перекрестных аккаунтов Google:

  • https://schemas.openid.net/secevent/risc/event-type/sessions-revoked
  • https://schemas.openid.net/secevent/oauth/event-type/token-revoked
  • https://schemas.openid.net/secevent/risc/event-type/account-disabled

Дополнительную информацию о реализации защиты перекрестных учетных записей и полный список доступных событий см. на странице Защита учетных записей пользователей с помощью защиты перекрестных учетных записей.